<?php
/**
 *+------------------
 * Lflow
 *+------------------
 * Copyright (c) 2023~2030 gitee.com/liu_guan_qing All rights reserved.本版权不可删除，侵权必究
 *+------------------
 * Author: Mr.April(405784684@qq.com)
 *+------------------
 */
declare (strict_types=1);

namespace lflow;

use lflow\access\Page;
use lflow\access\QueryFilter;
use lflow\entity\Process;

/**
 * 流程定义业务类
 *
 * @author Mr.April
 * @since  1.0
 */
interface IProcessService
{
    /**
     * check
     *
     * @param \lflow\entity\Process $process  流程定义对象
     * @param String                $idOrName 流程定义id/name
     */
    public function check(Process $process, string $idOrName): void;

    /**
     *  保存流程定义
     * @param \lflow\entity\Process $process
     */
    public function saveProcess(Process $process): void;

    /**
     * updateType  更新流程定义的类别
     *
     * @param String $id   流程定义id
     * @param String $type 类别
     */
    public function updateType(string $id, string $type): void;

    /**
     * getProcessById  根据主键ID获取流程定义对象
     *
     * @param String $id 流程定义id
     *
     * @return \lflow\entity\Process 流程定义对象
     */
    public function getProcessById(string $id): Process;

    /**
     * getProcessByName  根据流程name获取流程定义对象
     *
     * @param String $name 流程定义名称
     *
     * @return \lflow\entity\Process
     */
    public function getProcessByName(string $name): Process;

    /**
     * getProcessByVersion  根据流程name、version获取流程定义对象
     *
     * @param String $name    流程定义名称
     * @param int    $version 版本号
     *
     * @return \lflow\entity\Process
     */
    public function getProcessByVersion(string $name, int $version): Process;

    /**
     * getProcesss
     *
     * @param \lflow\access\QueryFilter $filter 查询过滤器
     * @param \lflow\access\Page|null   $page   分页对象
     *
     * @return array
     */
    public function getProcesss(QueryFilter $filter, ?Page $page): array;

    /**
     * cascadeRemove  谨慎使用.删除后无法恢复
     * 级联删除指定流程定义的所有数据
     * 1.wf_process
     * 2.wf_order,wf_hist_order
     * 3.wf_task,wf_hist_task
     * 4.wf_task_actor,wf_hist_task_actor
     * 5.wf_cc_order
     *
     * @param String $id
     *
     * @return mixed
     */
    public function cascadeRemove(string $id):void;
}